package br.com.android.aluno.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import br.com.android.aluno.overlay.Coordenada;

import com.google.android.maps.GeoPoint;

public class UtilMaps {
	
	/**
	 *  Obtem o endereco a partir das coordenadas
	 */
	public static Map<String, String> getEnderecos(Context context, GeoPoint p, int maxResultados) throws Exception{
		return getEnderecos(context, p.getLatitudeE6() / 1E6, p.getLongitudeE6() / 1E6, maxResultados);
	}
	
	/**
	 *  Obtem o endereco a partir das coordenadas
	 */
	public static Map<String, String> getEnderecos(Context context, double latitude, double longitude, int maxResultados) throws IOException, Exception{
		Geocoder gc = new Geocoder(context, Locale.getDefault());		
		List<Address> enderecos = gc.getFromLocation(latitude, longitude, maxResultados);
		
		Map<String, String> mapEnderecos = new HashMap<String, String>();
		
        if (enderecos.size() > 0) {
            Address address = enderecos.get(0);
            
            for (int i = 0; i < address.getMaxAddressLineIndex(); i++){
//            	Log.e(Constantes.CATEGORIA, "sb: " + address.getAddressLine(i)); 
            	String split[] = null; 
            	
                switch (i) {
					case 0:
						split = address.getAddressLine(i).split("-"); // -3.76853,-38.495301
						if(split.length > 2){
							mapEnderecos.put(Constantes.MAPA_ENDERECO, split[0].trim() + "-" + split[1].trim());
							mapEnderecos.put(Constantes.MAPA_BAIRRO, split[2].trim());
						} else{
							mapEnderecos.put(Constantes.MAPA_ENDERECO, split[0].trim());
							mapEnderecos.put(Constantes.MAPA_BAIRRO, split[1].trim());
						}
						break;
					case 1:
						split = address.getAddressLine(i).split("-"); 
						mapEnderecos.put(Constantes.MAPA_CIDADE, split[0].trim());
						mapEnderecos.put(Constantes.MAPA_ESTADO, split[1].trim());
						break;
					case 2:
						mapEnderecos.put(Constantes.MAPA_CEP, address.getAddressLine(i).trim());
						break;
					case 3:
						mapEnderecos.put(Constantes.MAPA_PAIS, address.getAddressLine(i).trim());
						break;
				}
            }
            
            mapEnderecos.put(Constantes.MAPA_PAIS, address.getCountryName());
            
            return mapEnderecos;
        }
        
        return null;
	}
	
	public static Coordenada getGeoPointFromAddress(String address, Context context){
		Coordenada coordenada = null;
		
		try {
			Geocoder geocoder = new Geocoder(context);
			List<Address> addresses = geocoder.getFromLocationName(address, 3);

			if (addresses != null && addresses.size() > 0) {
				coordenada = new Coordenada(addresses.get(0).getLatitude(), addresses.get(0).getLongitude());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return coordenada;
	}
}
